<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/Python-3.6.2/Include/bytesobject.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/Python-3.6.2/Include/bytesobject.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> 
<a name="2" /><span class="True">       2:</span> <span class="k">/* Bytes (String) object interface */</span>
<a name="3" /><span class="True">       3:</span> 
<a name="4" /><span class="True">       4:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="macros_noref.html#_UHlfQllURVNPQkpFQ1RfSF8w"><span class="b">Py_BYTESOBJECT_H</span></a>
<a name="5" /><span class="True">       5:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlfQllURVNPQkpFQ1RfSF8w"><span class="b">Py_BYTESOBJECT_H</span></a>
<a name="6" /><span class="False">       6:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">__cplusplus</span>
<a name="7" /><span class="False">       7:</span> <span class="m">extern</span> <span class="e">&quot;C&quot;</span> <span class="f">{</span>
<a name="8" /><span class="True">       8:</span> <span class="f">#</span><span class="n">endif</span>
<a name="9" /><span class="True">       9:</span> 
<a name="10" /><span class="True">      10:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">stdarg</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="11" /><span class="True">      11:</span> 
<a name="12" /><span class="True">      12:</span> <span class="k">/*</span>
<a name="13" /><span class="True">      13:</span> <span class="k">Type PyBytesObject represents a character string.  An extra zero byte is</span>
<a name="14" /><span class="True">      14:</span> <span class="k">reserved at the end to ensure it is zero-terminated, but a size is</span>
<a name="15" /><span class="True">      15:</span> <span class="k">present so strings with null bytes in them can be represented.  This</span>
<a name="16" /><span class="True">      16:</span> <span class="k">is an immutable object type.</span>
<a name="17" /><span class="True">      17:</span> <span class="k"></span>
<a name="18" /><span class="True">      18:</span> <span class="k">There are functions to create new string objects, to test</span>
<a name="19" /><span class="True">      19:</span> <span class="k">an object for string-ness, and to get the</span>
<a name="20" /><span class="True">      20:</span> <span class="k">string value.  The latter function returns a null pointer</span>
<a name="21" /><span class="True">      21:</span> <span class="k">if the object is not of the proper type.</span>
<a name="22" /><span class="True">      22:</span> <span class="k">There is a variant that takes an explicit size as well as a</span>
<a name="23" /><span class="True">      23:</span> <span class="k">variant that assumes a zero-terminated string.  Note that none of the</span>
<a name="24" /><span class="True">      24:</span> <span class="k">functions should be applied to nil objects.</span>
<a name="25" /><span class="True">      25:</span> <span class="k">*/</span>
<a name="26" /><span class="True">      26:</span> 
<a name="27" /><span class="True">      27:</span> <span class="k">/* Caching the hash (ob_shash) saves recalculation of a string&apos;s hash value.</span>
<a name="28" /><span class="True">      28:</span> <span class="k">   This significantly speeds up dict lookups. */</span>
<a name="29" /><span class="True">      29:</span> 
<a name="30" /><span class="True">      30:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="31" /><span class="True">      31:</span> <span class="m">typedef</span> <span class="m">struct</span> <span class="f">{</span>
<a name="32" /><span class="True">      32:</span>     <a href="macros_ref.html#_UHlPYmplY3RfVkFSX0hFQURfMA__"><span class="b">PyObject_VAR_HEAD</span></a>
<a name="33" /><span class="True">      33:</span>     <span class="b">Py_hash_t</span> <span class="b">ob_shash</span><span class="f">;</span>
<a name="34" /><span class="True">      34:</span>     <span class="m">char</span> <span class="b">ob_sval</span><span class="f">[</span><span class="c">1</span><span class="f">]</span><span class="f">;</span>
<a name="35" /><span class="True">      35:</span> 
<a name="36" /><span class="True">      36:</span>     <span class="k">/* Invariants:</span>
<a name="37" /><span class="True">      37:</span> <span class="k">     *     ob_sval contains space for &apos;ob_size+1&apos; elements.</span>
<a name="38" /><span class="True">      38:</span> <span class="k">     *     ob_sval[ob_size] == 0.</span>
<a name="39" /><span class="True">      39:</span> <span class="k">     *     ob_shash is the hash of the string or -1 if not computed yet.</span>
<a name="40" /><span class="True">      40:</span> <span class="k">     */</span>
<a name="41" /><span class="True">      41:</span> <span class="f">}</span> <span class="b">PyBytesObject</span><span class="f">;</span>
<a name="42" /><span class="True">      42:</span> <span class="f">#</span><span class="n">endif</span>
<a name="43" /><span class="True">      43:</span> 
<a name="44" /><span class="True">      44:</span> <a href="macros_ref.html#_UHlBUElfREFUQV8w"><span class="b">PyAPI_DATA</span></a><span class="f">(</span><span class="b">PyTypeObject</span><span class="f">)</span> <span class="b">PyBytes_Type</span><span class="f">;</span>
<a name="45" /><span class="True">      45:</span> <a href="macros_ref.html#_UHlBUElfREFUQV8w"><span class="b">PyAPI_DATA</span></a><span class="f">(</span><span class="b">PyTypeObject</span><span class="f">)</span> <span class="b">PyBytesIter_Type</span><span class="f">;</span>
<a name="46" /><span class="True">      46:</span> 
<a name="47" /><span class="True">      47:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlCeXRlc19DaGVja18w"><span class="b">PyBytes_Check</span></a><span class="f">(</span><span class="b">op</span><span class="f">)</span> \
<a name="48" /><span class="True">      48:</span>                  <a href="macros_ref.html#_UHlUeXBlX0Zhc3RTdWJjbGFzc18w"><span class="b">PyType_FastSubclass</span></a><span class="f">(</span><a href="macros_ref.html#_UHlfVFlQRV8w"><span class="b">Py_TYPE</span></a><span class="f">(</span><span class="b">op</span><span class="f">)</span><span class="f">,</span> <a href="macros_noref.html#_UHlfVFBGTEFHU19CWVRFU19TVUJDTEFTU18w"><span class="b">Py_TPFLAGS_BYTES_SUBCLASS</span></a><span class="f">)</span>
<a name="49" /><span class="True">      49:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlCeXRlc19DaGVja0V4YWN0XzA_"><span class="b">PyBytes_CheckExact</span></a><span class="f">(</span><span class="b">op</span><span class="f">)</span> <span class="f">(</span><a href="macros_ref.html#_UHlfVFlQRV8w"><span class="b">Py_TYPE</span></a><span class="f">(</span><span class="b">op</span><span class="f">)</span> <span class="f">==</span> <span class="f">&amp;</span><span class="b">PyBytes_Type</span><span class="f">)</span>
<a name="50" /><span class="True">      50:</span> 
<a name="51" /><span class="True">      51:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyBytes_FromStringAndSize</span><span class="f">(</span><span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="f">,</span> <span class="b">Py_ssize_t</span><span class="f">)</span><span class="f">;</span>
<a name="52" /><span class="True">      52:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyBytes_FromString</span><span class="f">(</span><span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="53" /><span class="True">      53:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyBytes_FromObject</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="54" /><span class="True">      54:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyBytes_FromFormatV</span><span class="f">(</span><span class="m">const</span> <span class="m">char</span><span class="f">*</span><span class="f">,</span> <span class="b">va_list</span><span class="f">)</span>
<a name="55" /><span class="True">      55:</span>                 <a href="macros_ref.html#_UHlfR0NDX0FUVFJJQlVURV8w"><span class="b">Py_GCC_ATTRIBUTE</span></a><span class="f">(</span><span class="f">(</span><span class="b">format</span><span class="f">(</span><span class="b">printf</span><span class="f">,</span> <span class="c">1</span><span class="f">,</span> <span class="c">0</span><span class="f">)</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="56" /><span class="True">      56:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyBytes_FromFormat</span><span class="f">(</span><span class="m">const</span> <span class="m">char</span><span class="f">*</span><span class="f">,</span> <span class="f">...</span><span class="f">)</span>
<a name="57" /><span class="True">      57:</span>                 <a href="macros_ref.html#_UHlfR0NDX0FUVFJJQlVURV8w"><span class="b">Py_GCC_ATTRIBUTE</span></a><span class="f">(</span><span class="f">(</span><span class="b">format</span><span class="f">(</span><span class="b">printf</span><span class="f">,</span> <span class="c">1</span><span class="f">,</span> <span class="c">2</span><span class="f">)</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="58" /><span class="True">      58:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">Py_ssize_t</span><span class="f">)</span> <span class="b">PyBytes_Size</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="59" /><span class="True">      59:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">char</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyBytes_AsString</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="60" /><span class="True">      60:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyBytes_Repr</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">,</span> <span class="m">int</span><span class="f">)</span><span class="f">;</span>
<a name="61" /><span class="True">      61:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="b">PyBytes_Concat</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">*</span><span class="f">,</span> <span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="62" /><span class="True">      62:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="b">PyBytes_ConcatAndDel</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">*</span><span class="f">,</span> <span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="63" /><span class="True">      63:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="64" /><span class="True">      64:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">int</span><span class="f">)</span> <span class="b">_PyBytes_Resize</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">*</span><span class="f">,</span> <span class="b">Py_ssize_t</span><span class="f">)</span><span class="f">;</span>
<a name="65" /><span class="True">      65:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span><span class="f">*</span><span class="f">)</span> <span class="b">_PyBytes_FormatEx</span><span class="f">(</span>
<a name="66" /><span class="True">      66:</span>     <span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="b">format</span><span class="f">,</span>
<a name="67" /><span class="True">      67:</span>     <span class="b">Py_ssize_t</span> <span class="b">format_len</span><span class="f">,</span>
<a name="68" /><span class="True">      68:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">args</span><span class="f">,</span>
<a name="69" /><span class="True">      69:</span>     <span class="m">int</span> <span class="b">use_bytearray</span><span class="f">)</span><span class="f">;</span>
<a name="70" /><span class="True">      70:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span><span class="f">*</span><span class="f">)</span> <span class="b">_PyBytes_FromHex</span><span class="f">(</span>
<a name="71" /><span class="True">      71:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">string</span><span class="f">,</span>
<a name="72" /><span class="True">      72:</span>     <span class="m">int</span> <span class="b">use_bytearray</span><span class="f">)</span><span class="f">;</span>
<a name="73" /><span class="True">      73:</span> <span class="f">#</span><span class="n">endif</span>
<a name="74" /><span class="True">      74:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyBytes_DecodeEscape</span><span class="f">(</span><span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="f">,</span> <span class="b">Py_ssize_t</span><span class="f">,</span>
<a name="75" /><span class="True">      75:</span>                            <span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="f">,</span> <span class="b">Py_ssize_t</span><span class="f">,</span>
<a name="76" /><span class="True">      76:</span>                            <span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="77" /><span class="True">      77:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="78" /><span class="True">      78:</span> <span class="k">/* Helper for PyBytes_DecodeEscape that detects invalid escape chars. */</span>
<a name="79" /><span class="True">      79:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">_PyBytes_DecodeEscape</span><span class="f">(</span><span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="f">,</span> <span class="b">Py_ssize_t</span><span class="f">,</span>
<a name="80" /><span class="True">      80:</span>                                              <span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="f">,</span> <span class="b">Py_ssize_t</span><span class="f">,</span>
<a name="81" /><span class="True">      81:</span>                                              <span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="f">,</span>
<a name="82" /><span class="True">      82:</span>                                              <span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="83" /><span class="True">      83:</span> <span class="f">#</span><span class="n">endif</span>
<a name="84" /><span class="True">      84:</span> 
<a name="85" /><span class="True">      85:</span> <span class="k">/* Macro, trading safety for speed */</span>
<a name="86" /><span class="True">      86:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="87" /><span class="True">      87:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlCeXRlc19BU19TVFJJTkdfMA__"><span class="b">PyBytes_AS_STRING</span></a><span class="f">(</span><span class="b">op</span><span class="f">)</span> <span class="f">(</span><a href="macros_ref.html#_YXNzZXJ0XzA_"><span class="b">assert</span></a><span class="f">(</span><a href="macros_noref.html#_UHlCeXRlc19DaGVja18w"><span class="b">PyBytes_Check</span></a><span class="f">(</span><span class="b">op</span><span class="f">)</span><span class="f">)</span><span class="f">,</span> \
<a name="88" /><span class="True">      88:</span>                                 <span class="f">(</span><span class="f">(</span><span class="f">(</span><span class="b">PyBytesObject</span> <span class="f">*</span><span class="f">)</span><span class="f">(</span><span class="b">op</span><span class="f">)</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">ob_sval</span><span class="f">)</span><span class="f">)</span>
<a name="89" /><span class="True">      89:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlCeXRlc19HRVRfU0laRV8w"><span class="b">PyBytes_GET_SIZE</span></a><span class="f">(</span><span class="b">op</span><span class="f">)</span>  <span class="f">(</span><a href="macros_ref.html#_YXNzZXJ0XzA_"><span class="b">assert</span></a><span class="f">(</span><a href="macros_noref.html#_UHlCeXRlc19DaGVja18w"><span class="b">PyBytes_Check</span></a><span class="f">(</span><span class="b">op</span><span class="f">)</span><span class="f">)</span><span class="f">,</span><a href="macros_ref.html#_UHlfU0laRV8w"><span class="b">Py_SIZE</span></a><span class="f">(</span><span class="b">op</span><span class="f">)</span><span class="f">)</span>
<a name="90" /><span class="True">      90:</span> <span class="f">#</span><span class="n">endif</span>
<a name="91" /><span class="True">      91:</span> 
<a name="92" /><span class="True">      92:</span> <span class="k">/* _PyBytes_Join(sep, x) is like sep.join(x).  sep must be PyBytesObject*,</span>
<a name="93" /><span class="True">      93:</span> <span class="k">   x must be an iterable object. */</span>
<a name="94" /><span class="True">      94:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="95" /><span class="True">      95:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">_PyBytes_Join</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="b">sep</span><span class="f">,</span> <span class="b">PyObject</span> <span class="f">*</span><span class="b">x</span><span class="f">)</span><span class="f">;</span>
<a name="96" /><span class="True">      96:</span> <span class="f">#</span><span class="n">endif</span>
<a name="97" /><span class="True">      97:</span> 
<a name="98" /><span class="True">      98:</span> <span class="k">/* Provides access to the internal data buffer and size of a string</span>
<a name="99" /><span class="True">      99:</span> <span class="k">   object or the default encoded version of a Unicode object. Passing</span>
<a name="100" /><span class="True">     100:</span> <span class="k">   NULL as *len parameter will force the string buffer to be</span>
<a name="101" /><span class="True">     101:</span> <span class="k">   0-terminated (passing a string with embedded NULL characters will</span>
<a name="102" /><span class="True">     102:</span> <span class="k">   cause an exception).  */</span>
<a name="103" /><span class="True">     103:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">int</span><span class="f">)</span> <span class="b">PyBytes_AsStringAndSize</span><span class="f">(</span>
<a name="104" /><span class="True">     104:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">obj</span><span class="f">,</span>      <span class="k">/* string or Unicode object */</span>
<a name="105" /><span class="True">     105:</span>     <span class="m">char</span> <span class="f">*</span><span class="f">*</span><span class="b">s</span><span class="f">,</span>           <span class="k">/* pointer to buffer variable */</span>
<a name="106" /><span class="True">     106:</span>     <span class="b">Py_ssize_t</span> <span class="f">*</span><span class="b">len</span>     <span class="k">/* pointer to length variable or NULL</span>
<a name="107" /><span class="True">     107:</span> <span class="k">                           (only possible for 0-terminated</span>
<a name="108" /><span class="True">     108:</span> <span class="k">                           strings) */</span>
<a name="109" /><span class="True">     109:</span>     <span class="f">)</span><span class="f">;</span>
<a name="110" /><span class="True">     110:</span> 
<a name="111" /><span class="True">     111:</span> <span class="k">/* Using the current locale, insert the thousands grouping</span>
<a name="112" /><span class="True">     112:</span> <span class="k">   into the string pointed to by buffer.  For the argument descriptions,</span>
<a name="113" /><span class="True">     113:</span> <span class="k">   see Objects/stringlib/localeutil.h */</span>
<a name="114" /><span class="True">     114:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="115" /><span class="True">     115:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">Py_ssize_t</span><span class="f">)</span> <span class="b">_PyBytes_InsertThousandsGroupingLocale</span><span class="f">(</span><span class="m">char</span> <span class="f">*</span><span class="b">buffer</span><span class="f">,</span>
<a name="116" /><span class="True">     116:</span>                                                    <span class="b">Py_ssize_t</span> <span class="b">n_buffer</span><span class="f">,</span>
<a name="117" /><span class="True">     117:</span>                                                    <span class="m">char</span> <span class="f">*</span><span class="b">digits</span><span class="f">,</span>
<a name="118" /><span class="True">     118:</span>                                                    <span class="b">Py_ssize_t</span> <span class="b">n_digits</span><span class="f">,</span>
<a name="119" /><span class="True">     119:</span>                                                    <span class="b">Py_ssize_t</span> <span class="b">min_width</span><span class="f">)</span><span class="f">;</span>
<a name="120" /><span class="True">     120:</span> 
<a name="121" /><span class="True">     121:</span> <span class="k">/* Using explicit passed-in values, insert the thousands grouping</span>
<a name="122" /><span class="True">     122:</span> <span class="k">   into the string pointed to by buffer.  For the argument descriptions,</span>
<a name="123" /><span class="True">     123:</span> <span class="k">   see Objects/stringlib/localeutil.h */</span>
<a name="124" /><span class="True">     124:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">Py_ssize_t</span><span class="f">)</span> <span class="b">_PyBytes_InsertThousandsGrouping</span><span class="f">(</span><span class="m">char</span> <span class="f">*</span><span class="b">buffer</span><span class="f">,</span>
<a name="125" /><span class="True">     125:</span>                                                    <span class="b">Py_ssize_t</span> <span class="b">n_buffer</span><span class="f">,</span>
<a name="126" /><span class="True">     126:</span>                                                    <span class="m">char</span> <span class="f">*</span><span class="b">digits</span><span class="f">,</span>
<a name="127" /><span class="True">     127:</span>                                                    <span class="b">Py_ssize_t</span> <span class="b">n_digits</span><span class="f">,</span>
<a name="128" /><span class="True">     128:</span>                                                    <span class="b">Py_ssize_t</span> <span class="b">min_width</span><span class="f">,</span>
<a name="129" /><span class="True">     129:</span>                                                    <span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="b">grouping</span><span class="f">,</span>
<a name="130" /><span class="True">     130:</span>                                                    <span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="b">thousands_sep</span><span class="f">)</span><span class="f">;</span>
<a name="131" /><span class="True">     131:</span> <span class="f">#</span><span class="n">endif</span>
<a name="132" /><span class="True">     132:</span> 
<a name="133" /><span class="True">     133:</span> <span class="k">/* Flags used by string formatting */</span>
<a name="134" /><span class="True">     134:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_Rl9MSlVTVF8w"><span class="b">F_LJUST</span></a> <span class="f">(</span><span class="c">1</span><span class="f">&lt;&lt;</span><span class="c">0</span><span class="f">)</span>
<a name="135" /><span class="True">     135:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_Rl9TSUdOXzA_"><span class="b">F_SIGN</span></a>    <span class="f">(</span><span class="c">1</span><span class="f">&lt;&lt;</span><span class="c">1</span><span class="f">)</span>
<a name="136" /><span class="True">     136:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_Rl9CTEFOS18w"><span class="b">F_BLANK</span></a> <span class="f">(</span><span class="c">1</span><span class="f">&lt;&lt;</span><span class="c">2</span><span class="f">)</span>
<a name="137" /><span class="True">     137:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_Rl9BTFRfMA__"><span class="b">F_ALT</span></a>    <span class="f">(</span><span class="c">1</span><span class="f">&lt;&lt;</span><span class="c">3</span><span class="f">)</span>
<a name="138" /><span class="True">     138:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_Rl9aRVJPXzA_"><span class="b">F_ZERO</span></a>    <span class="f">(</span><span class="c">1</span><span class="f">&lt;&lt;</span><span class="c">4</span><span class="f">)</span>
<a name="139" /><span class="True">     139:</span> 
<a name="140" /><span class="True">     140:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="141" /><span class="True">     141:</span> <span class="k">/* The _PyBytesWriter structure is big: it contains an embedded &quot;stack buffer&quot;.</span>
<a name="142" /><span class="True">     142:</span> <span class="k">   A _PyBytesWriter variable must be declared at the end of variables in a</span>
<a name="143" /><span class="True">     143:</span> <span class="k">   function to optimize the memory allocation on the stack. */</span>
<a name="144" /><span class="True">     144:</span> <span class="m">typedef</span> <span class="m">struct</span> <span class="f">{</span>
<a name="145" /><span class="True">     145:</span>     <span class="k">/* bytes, bytearray or NULL (when the small buffer is used) */</span>
<a name="146" /><span class="True">     146:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">buffer</span><span class="f">;</span>
<a name="147" /><span class="True">     147:</span> 
<a name="148" /><span class="True">     148:</span>     <span class="k">/* Number of allocated size. */</span>
<a name="149" /><span class="True">     149:</span>     <span class="b">Py_ssize_t</span> <span class="b">allocated</span><span class="f">;</span>
<a name="150" /><span class="True">     150:</span> 
<a name="151" /><span class="True">     151:</span>     <span class="k">/* Minimum number of allocated bytes,</span>
<a name="152" /><span class="True">     152:</span> <span class="k">       incremented by _PyBytesWriter_Prepare() */</span>
<a name="153" /><span class="True">     153:</span>     <span class="b">Py_ssize_t</span> <span class="b">min_size</span><span class="f">;</span>
<a name="154" /><span class="True">     154:</span> 
<a name="155" /><span class="True">     155:</span>     <span class="k">/* If non-zero, use a bytearray instead of a bytes object for buffer. */</span>
<a name="156" /><span class="True">     156:</span>     <span class="m">int</span> <span class="b">use_bytearray</span><span class="f">;</span>
<a name="157" /><span class="True">     157:</span> 
<a name="158" /><span class="True">     158:</span>     <span class="k">/* If non-zero, overallocate the buffer (default: 0).</span>
<a name="159" /><span class="True">     159:</span> <span class="k">       This flag must be zero if use_bytearray is non-zero. */</span>
<a name="160" /><span class="True">     160:</span>     <span class="m">int</span> <span class="b">overallocate</span><span class="f">;</span>
<a name="161" /><span class="True">     161:</span> 
<a name="162" /><span class="True">     162:</span>     <span class="k">/* Stack buffer */</span>
<a name="163" /><span class="True">     163:</span>     <span class="m">int</span> <span class="b">use_small_buffer</span><span class="f">;</span>
<a name="164" /><span class="True">     164:</span>     <span class="m">char</span> <span class="b">small_buffer</span><span class="f">[</span><span class="c">512</span><span class="f">]</span><span class="f">;</span>
<a name="165" /><span class="True">     165:</span> <span class="f">}</span> <span class="b">_PyBytesWriter</span><span class="f">;</span>
<a name="166" /><span class="True">     166:</span> 
<a name="167" /><span class="True">     167:</span> <span class="k">/* Initialize a bytes writer</span>
<a name="168" /><span class="True">     168:</span> <span class="k"></span>
<a name="169" /><span class="True">     169:</span> <span class="k">   By default, the overallocation is disabled. Set the overallocate attribute</span>
<a name="170" /><span class="True">     170:</span> <span class="k">   to control the allocation of the buffer. */</span>
<a name="171" /><span class="True">     171:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="b">_PyBytesWriter_Init</span><span class="f">(</span><span class="b">_PyBytesWriter</span> <span class="f">*</span><span class="b">writer</span><span class="f">)</span><span class="f">;</span>
<a name="172" /><span class="True">     172:</span> 
<a name="173" /><span class="True">     173:</span> <span class="k">/* Get the buffer content and reset the writer.</span>
<a name="174" /><span class="True">     174:</span> <span class="k">   Return a bytes object, or a bytearray object if use_bytearray is non-zero.</span>
<a name="175" /><span class="True">     175:</span> <span class="k">   Raise an exception and return NULL on error. */</span>
<a name="176" /><span class="True">     176:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">_PyBytesWriter_Finish</span><span class="f">(</span><span class="b">_PyBytesWriter</span> <span class="f">*</span><span class="b">writer</span><span class="f">,</span>
<a name="177" /><span class="True">     177:</span>     <span class="m">void</span> <span class="f">*</span><span class="b">str</span><span class="f">)</span><span class="f">;</span>
<a name="178" /><span class="True">     178:</span> 
<a name="179" /><span class="True">     179:</span> <span class="k">/* Deallocate memory of a writer (clear its internal buffer). */</span>
<a name="180" /><span class="True">     180:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="b">_PyBytesWriter_Dealloc</span><span class="f">(</span><span class="b">_PyBytesWriter</span> <span class="f">*</span><span class="b">writer</span><span class="f">)</span><span class="f">;</span>
<a name="181" /><span class="True">     181:</span> 
<a name="182" /><span class="True">     182:</span> <span class="k">/* Allocate the buffer to write size bytes.</span>
<a name="183" /><span class="True">     183:</span> <span class="k">   Return the pointer to the beginning of buffer data.</span>
<a name="184" /><span class="True">     184:</span> <span class="k">   Raise an exception and return NULL on error. */</span>
<a name="185" /><span class="True">     185:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">void</span><span class="f">*</span><span class="f">)</span> <span class="b">_PyBytesWriter_Alloc</span><span class="f">(</span><span class="b">_PyBytesWriter</span> <span class="f">*</span><span class="b">writer</span><span class="f">,</span>
<a name="186" /><span class="True">     186:</span>     <span class="b">Py_ssize_t</span> <span class="b">size</span><span class="f">)</span><span class="f">;</span>
<a name="187" /><span class="True">     187:</span> 
<a name="188" /><span class="True">     188:</span> <span class="k">/* Ensure that the buffer is large enough to write *size* bytes.</span>
<a name="189" /><span class="True">     189:</span> <span class="k">   Add size to the writer minimum size (min_size attribute).</span>
<a name="190" /><span class="True">     190:</span> <span class="k"></span>
<a name="191" /><span class="True">     191:</span> <span class="k">   str is the current pointer inside the buffer.</span>
<a name="192" /><span class="True">     192:</span> <span class="k">   Return the updated current pointer inside the buffer.</span>
<a name="193" /><span class="True">     193:</span> <span class="k">   Raise an exception and return NULL on error. */</span>
<a name="194" /><span class="True">     194:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">void</span><span class="f">*</span><span class="f">)</span> <span class="b">_PyBytesWriter_Prepare</span><span class="f">(</span><span class="b">_PyBytesWriter</span> <span class="f">*</span><span class="b">writer</span><span class="f">,</span>
<a name="195" /><span class="True">     195:</span>     <span class="m">void</span> <span class="f">*</span><span class="b">str</span><span class="f">,</span>
<a name="196" /><span class="True">     196:</span>     <span class="b">Py_ssize_t</span> <span class="b">size</span><span class="f">)</span><span class="f">;</span>
<a name="197" /><span class="True">     197:</span> 
<a name="198" /><span class="True">     198:</span> <span class="k">/* Resize the buffer to make it larger.</span>
<a name="199" /><span class="True">     199:</span> <span class="k">   The new buffer may be larger than size bytes because of overallocation.</span>
<a name="200" /><span class="True">     200:</span> <span class="k">   Return the updated current pointer inside the buffer.</span>
<a name="201" /><span class="True">     201:</span> <span class="k">   Raise an exception and return NULL on error.</span>
<a name="202" /><span class="True">     202:</span> <span class="k"></span>
<a name="203" /><span class="True">     203:</span> <span class="k">   Note: size must be greater than the number of allocated bytes in the writer.</span>
<a name="204" /><span class="True">     204:</span> <span class="k"></span>
<a name="205" /><span class="True">     205:</span> <span class="k">   This function doesn&apos;t use the writer minimum size (min_size attribute).</span>
<a name="206" /><span class="True">     206:</span> <span class="k"></span>
<a name="207" /><span class="True">     207:</span> <span class="k">   See also _PyBytesWriter_Prepare().</span>
<a name="208" /><span class="True">     208:</span> <span class="k">   */</span>
<a name="209" /><span class="True">     209:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">void</span><span class="f">*</span><span class="f">)</span> <span class="b">_PyBytesWriter_Resize</span><span class="f">(</span><span class="b">_PyBytesWriter</span> <span class="f">*</span><span class="b">writer</span><span class="f">,</span>
<a name="210" /><span class="True">     210:</span>     <span class="m">void</span> <span class="f">*</span><span class="b">str</span><span class="f">,</span>
<a name="211" /><span class="True">     211:</span>     <span class="b">Py_ssize_t</span> <span class="b">size</span><span class="f">)</span><span class="f">;</span>
<a name="212" /><span class="True">     212:</span> 
<a name="213" /><span class="True">     213:</span> <span class="k">/* Write bytes.</span>
<a name="214" /><span class="True">     214:</span> <span class="k">   Raise an exception and return NULL on error. */</span>
<a name="215" /><span class="True">     215:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">void</span><span class="f">*</span><span class="f">)</span> <span class="b">_PyBytesWriter_WriteBytes</span><span class="f">(</span><span class="b">_PyBytesWriter</span> <span class="f">*</span><span class="b">writer</span><span class="f">,</span>
<a name="216" /><span class="True">     216:</span>     <span class="m">void</span> <span class="f">*</span><span class="b">str</span><span class="f">,</span>
<a name="217" /><span class="True">     217:</span>     <span class="m">const</span> <span class="m">void</span> <span class="f">*</span><span class="b">bytes</span><span class="f">,</span>
<a name="218" /><span class="True">     218:</span>     <span class="b">Py_ssize_t</span> <span class="b">size</span><span class="f">)</span><span class="f">;</span>
<a name="219" /><span class="True">     219:</span> <span class="f">#</span><span class="n">endif</span>   <span class="k">/* Py_LIMITED_API */</span>
<a name="220" /><span class="True">     220:</span> 
<a name="221" /><span class="False">     221:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">__cplusplus</span>
<a name="222" /><span class="False">     222:</span> <span class="f">}</span>
<a name="223" /><span class="True">     223:</span> <span class="f">#</span><span class="n">endif</span>
<a name="224" /><span class="True">     224:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* !Py_BYTESOBJECT_H */</span>
<a name="225" /><span class="True">     225:</span> </pre>
  </body>
</html>
